/**
 * estatistica.cpp
 * Autores: Danilo S. Carvalho	- 107390588
 * 			Taísa L. Martins	- 107362828 
 *
 */

#include "estatistica.h"


namespace SimuladorAD {
    
    Amostra::Amostra(){
	    
	    clear();
	}
	
	void Amostra::clear(void){
	  
		T = 0.0;
		X = 0.0;
	    N = 0;
	    Nq = 0;
	    W = 0.0;
	    vW = 0.0;
	    
	    var_T = 0.0;
		var_X = 0.0;
	    var_N = 0.0;
	    var_Nq = 0.0;
	    var_W = 0.0;
	    var_vW = 0.0;
	    
		T_quad = 0.0;
		X_quad = 0.0;
	    N_quad = 0;
	    Nq_quad = 0;
	    W_quad = 0.0;
	    vW_quad = 0.0;
	      
	}

	void Amostra::insere_amostra(double tempo_total, int numero_total_de_pessoas, int numero_de_pessoas_em_espera, double tempo_espera){
	    // Acrescenta os valores aos respectivos campos da amostra.
	    T += tempo_total;
		X += (tempo_total - tempo_espera);
	    N += numero_total_de_pessoas;
	    Nq += numero_de_pessoas_em_espera;
	    W += tempo_espera;
		T_quad += (tempo_total * tempo_total);
		X_quad += (tempo_total - tempo_espera) * (tempo_total - tempo_espera);
	    N_quad += (numero_total_de_pessoas * numero_total_de_pessoas);
	    Nq_quad += (numero_de_pessoas_em_espera * numero_de_pessoas_em_espera);
	    W_quad += (tempo_espera * tempo_espera);	  
	}
    
    void ResultadosSimulacao::clear (void){
		// Limpa tudo.
		quantidade = 0;
		fila[0].clear();
		fila[1].clear();
	
	}
	
	void ResultadosSimulacao::operator+=(ResultadosSimulacao op2){
	
		quantidade += 1;
		
		for(int i = 0; i < 2; ++i){
			
			fila[i].T += op2.fila[i].T;
			fila[i].X += op2.fila[i].X;
			fila[i].N += op2.fila[i].N;
			fila[i].Nq += op2.fila[i].Nq;
			fila[i].W += op2.fila[i].W;
			fila[i].vW += op2.fila[i].var_W;
			
			fila[i].T_quad += (op2.fila[i].T * op2.fila[i].T);
			fila[i].X_quad += (op2.fila[i].X * op2.fila[i].X );
			fila[i].N_quad += (op2.fila[i].N * op2.fila[i].N);
			fila[i].Nq_quad += (op2.fila[i].Nq * op2.fila[i].Nq);
			fila[i].W_quad += (op2.fila[i].W * op2.fila[i].W);
			fila[i].vW_quad += (op2.fila[i].var_W * op2.fila[i].var_W);
			
		}
				
	}
	
	void ResultadosSimulacao::calculaEstatisticas(void){
		
		for(int i = 0; i < 2; ++i){
			// Verifica se está vazio.
			if(quantidade < 1) continue;
			
			if(quantidade > 1){
			// Estima variância para cada grandeza.
				fila[i].var_T = fila[i].T_quad/(quantidade - 1.0) - (fila[i].T * fila[i].T)/((quantidade)*(quantidade -1.0));
				fila[i].var_X = fila[i].X_quad/(quantidade - 1.0) - (fila[i].X * fila[i].X)/((quantidade)*(quantidade -1.0));
				fila[i].var_N = fila[i].N_quad/(quantidade - 1.0) - (fila[i].N * fila[i].N )/((quantidade)*(quantidade -1.0));
				fila[i].var_Nq =fila[i].Nq_quad/(quantidade - 1.0)- (fila[i].Nq * fila[i].Nq)/((quantidade)*(quantidade -1.0));
				fila[i].var_W = fila[i].W_quad/(quantidade - 1.0) - (fila[i].W * fila[i].W)/((quantidade)*(quantidade -1.0));
				fila[i].var_vW = fila[i].vW_quad/(quantidade - 1.0) - (fila[i].vW * fila[i].vW )/((quantidade)*(quantidade -1.0));

			}
			
			fila[i].T /= quantidade;
			fila[i].X /= quantidade;
			fila[i].N /= quantidade;
			fila[i].Nq /= quantidade;
			fila[i].W /= quantidade;
			fila[i].vW /= quantidade;			
			
		}
		
	}
	    
}

